package com.xqboss.apps.domain.nft;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.xqboss.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.util.Date;
import java.util.stream.Stream;

/**
 * 对象 nft
 *
 * @author xqboss
 * @date 2023-08-02
 */
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("nft_old")
public class NftOld extends BaseEntity {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 作品名称
     */
    private String title;

    /**
     * 描述
     */
    private String description;

    /**
     * 主图
     */
    private String mainImg;

    /**
     * 展示图集
     */
    private String displayImgs;

    /**
     * 作者id
     */
    private Integer authorId;

    /**
     * 作者名称
     */
    private String authorName;

    /**
     * 作者头像
     */
    private String authorHeadimg;

    /**
     * 发行方id
     */
    private Integer publishId;

    /**
     * 发行方名称
     */
    private String publishName;

    /**
     * 发行方头像
     */
    private String publishHeadimg;

    /**
     * 作品详情
     */
    private String detailImgs;

    /**
     * 发行价格
     */
    private BigDecimal price;

    /**
     * 初始库存
     */
    private Integer initialStock;

    /**
     * 首发初始库存
     */
    private Integer firstStock;

    /**
     * 活动库存用于盲盒 合成等营销活动
     */
    private Integer extraStock;

    /**
     * 首发剩余库存
     */
    private Integer stock;

    /**
     * 显示库存 用于前端显示
     */
    private Integer displayStock;

    /**
     * 每人限购
     */
    private Integer limitStock;

    /**
     * 发售时间
     */
    private Date publishTime;

    /**
     * 发售截止时间
     */
    private Date publishEndTime;

    /**
     * 排序
     */
    private Integer sort;

    /**
     * 合成显示系数
     */
    private BigDecimal compoundShowCoefficient;

    /**
     * 标签
     */
    private String tags;

    private Integer isOnline;

    /**
     * 身份限购 0 关闭 1开启
     */
    private Integer limitUser;

    /**
     * 开启专属购 0关闭 开启
     */
    private Integer openExclusiveBuy;

    /**
     * 开启转卖
     */
    private Integer openSell;

    /**
     * 转卖封闭期 单位天
     */
    private BigDecimal sellCloseDay;

    /**
     * 开启转赠
     */
    private Integer openSend;

    /**
     * 转赠封闭期 单位天
     */
    private BigDecimal sendCloseDay;

    /**
     * 销量
     */
    private Integer saledNum;

    /**
     * 扩展字段
     */
    private String nftExtra;

    /**
     * 展示类型 1:图片 2:模型
     */
    private Integer showType;

    /**
     * 模型文件压缩包名称
     */
    private String zipName;

    private Integer canBuy;

    /**
     * 是否赠送礼品 0:否 1:是
     */
    private Integer isGiveGift;

    /**
     * 赠品类型 1: 权益卡 2:藏品
     */
    private Integer giftType;

    /**
     * 赠品id
     */
    private Long giftId;

    /**
     * 是否开启优先购 0:否 1:是
     */
    private Integer isPriorityBuy;

    /**
     * 优先购最大购买次数
     */
    private Integer priorityTimes;

    /**
     * 优先购提前购买天数
     */
    private Integer priorityDate;

    /**
     * 集市展示最低价
     */
    private BigDecimal marketPrice;

    /**
     * 分销设置,1默认,2自定义
     */
    private Integer distribution;

    /**
     * 买家上级自定义分销比例,单位百分号
     */
    private BigDecimal distributionProportion;

    /**
     * 是否开启持图购规则
     */
    private Integer isOpen;

    /**
     * 持图限购
     */
    private Integer holdLimitStock;

    /**
     * 防刷单 1开启 0关闭
     */
    private Integer limitBrush;

    /**
     * 次数计算方式 1求和 2最大 3最小
     */
    private Integer timesMode;

    /**
     * 开启优惠 1开启 0关闭
     */
    private Integer openDiscount;

    /**
     * 折扣模式 1比例 2固定值
     */
    private Integer discountMode;

    /**
     * 生成编号是否随机,0不随机,1随机
     */
    private Integer numRandom;

    /**
     * 下架冷却状态,1默认,2自定义,3关闭
     */
    private Integer lowerShelfCooling;

    /**
     * 冷却时间,单位为小时
     */
    private BigDecimal shelfTime;

    /**
     * 等级id
     */
    private Integer levelId;

    /**
     * 是否显示等级
     */
    private Integer displayLevel;

    /**
     * 涨幅,每10分钟计算一次
     */
    private BigDecimal increase;

    /**
     * 合成冷却是否开启 1开启 0关闭
     */
    private Integer compoundCoolingShow;

    /**
     * 合成冷却时间 单位 小时
     */
    private Integer compoundCoolingTime;

    /**
     * 是否推荐 0不推荐 1推荐
     */
    private Integer recommend;

    private Long chainSeriesId;

    private String unitImgs;

    private String nftNumber;

    /**
     * 限定方式 0不限制 1等级 2宠物藏品(蟾蜍) 3孵化器类型 4宠物系列
     */
    private Integer limitType;

    /**
     * 限定规则详情
     */
    private String limitRule;

    private Date createTime;

    private Date updateTime;

    private Date deleteTime;

    /**
     * 集市状态false:关闭,true:开启
     */
    private Integer marketStatus;

    /**
     * 集市费率,百分比
     */
    private BigDecimal serviceRate;

    /**
     * 定时维护状态false:关闭,true:开启
     */
    private Integer marketMaintainStatus;

    /**
     * 定时维护起始时间
     */
    private Date marketMaintainStart;

    /**
     * 定时维护结束时间,也是开放时间(结束时间不包含,开放时间包含)
     */
    private Date marketMaintainEnd;

    /**
     * 转卖限价状态0:默认,1:自定义,2关闭
     */
    private Integer resellFixedPriceStatus;

    /**
     * 限价依据,0基准值,1固定值
     */
    private Integer fixedPriceBasis;

    /**
     * 计算公式,0交易均价,1交易峰值,2交易底值
     */
    private Integer calculationFormula;

    /**
     * 最低限价,如果是基准值,则这里单位是百分比,如果是固定值,则这里单位是元
     */
    private BigDecimal minFixedPrice;

    /**
     * 最高限价,如果是基准值,则这里单位是百分比,如果是固定值,则这里单位是元
     */
    private BigDecimal maxFixedPrice;

    /**
     * 是否数据清理false:不清理,true:清理,将不符合的下架
     */
    private Integer dataClear;

    /**
     * 每日免封次数
     */
    private Integer dayExemptFrequency;

    /**
     * 转卖封禁状态false:关闭,true:开启
     */
    private Integer resellInterdiction;

    /**
     * 首次获得封禁时间,单位为小时
     */
    private Integer firstGetInterdiction;

    /**
     * 集市获得封禁时间,单位为小时
     */
    private Integer marketGetInterdiction;

    /**
     * 转卖封禁 0默认走大盘1自定义控制
     */
    private Integer sellForbidden;

    /**
     * 自定义转赠的封禁时间
     */
    private BigDecimal sendCloseTime;

    /**
     * 是否上链,1上链,0不上链
     */
    private Integer blockChain;

    /**
     * 是否显示商品流通总量, 1显示 0不显示
     */
    private Integer nftCirculateShow;

    /**
     * 藏品类型 1普通藏品 2宠物藏品 3道具藏品 4礼包藏品 5实物藏品
     */
    private Integer nftType;

    /**
     * 兑换时效 0关闭 1开启
     */
    private Integer exchangeTimeOpen;

    /**
     * 兑换时限 小时
     */
    private BigDecimal exchangeTime;

    /**
     * 是否开启特权,默认关闭
     */
    private Boolean openPrivilege;

    /**
     * 新增图片分页处理了的
     */
    private String displayPngImgs;

    /**
     * 关联文章id
     */
    private String articles;

    /**
     * 主图显示：0.组件图,1.详情图集
     */
    private Integer mainImageDisplay;

    /**
     * 补充类型 0其他 1精力 2生命值 3孵化器耐久度
     */
    private Integer supplementaryType;

    /**
     * 天珠抵扣金额
     */
    private BigDecimal jindouCashAmount;

    /**
     * 灵珠抵扣金额
     */
    private BigDecimal energyCashAmount;

    /**
     * 代币4抵扣金额
     */
    private BigDecimal coinCashAmount;

    /**
     * 玉珠抵扣金额
     */
    private BigDecimal integralCashAmount;

    /**
     * 市场价格
     */
    private BigDecimal mallMarketPrice;

    /**
     * 是否开启抵扣
     */
    private Integer mallIsOpen;

    /**
     * 运费
     */
    private BigDecimal deliveryFee;

    /**
     * 淘宝价格
     */
    private BigDecimal taoBao;

    /**
     * 是否开启满减活动 0开启 1不开启
     */
    private Integer isFullReduce;

    /**
     * 发行方备注
     */
    private String remarks;

    /**
     * 模拟销量
     */
    private Integer simulatedSales;

    /**
     * 成本价
     */
    private BigDecimal costPrice;

    /**
     * 新人限购开始时间
     */
    private Date limitStart;

    /**
     * 新人限购结束时间
     */
    private Date limitEnd;

    @ApiModelProperty(value = "流通总数")
    @TableField(exist = false)
    private Integer circulationNum;

    @ApiModelProperty(value = "持有人数")
    @TableField(exist = false)
    private Integer holdCount;

    @ApiModelProperty("剩余库存")
    @TableField(exist = false)
    private Integer surplusStock;

    @ApiModelProperty(value = "是否绑定")
    @TableField(exist = false)
    private Integer isBind = 0;

    @ApiModelProperty(value = "持有总人数")
    @TableField(exist = false)
    private Integer numberOfHolders;

    @ApiModelProperty(value = "在售数量")
    @TableField(exist = false)
    private Integer salesNum;

    @ApiModelProperty(value = "商品流通总量")
    @TableField(exist = false)
    private Integer num;

    public enum NftTypeEnum {
        NORMAL(1, "普通藏品"),
        PET(2, "宠物藏品"),
        PROP(3, "道具藏品"),
        GIFT(4, "道具藏品");

        private int value;
        private String description;

        NftTypeEnum(int value, String description) {
            this.value = value;
            this.description = description;
        }

        public int getValue() {
            return value;
        }

        public String getDescription() {
            return description;
        }

        public void setValue(int value) {
            this.value = value;
        }

        public static NftOld.NftTypeEnum toLevel(int value) {
            return Stream.of(NftOld.NftTypeEnum.values())
                    .filter(c -> c.value == value)
                    .findAny()
                    .orElse(null);
        }
    }
}

